<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>程序题</title>
</head>

<body>
    <script>
        /**11111111111111111111111111111111111111111111111111111*/
        for (var i = 1; i <= 5; i++) {
            (function (a) {                //(()=>)是自动执行函数   自执行函数 (()=>{})() 或者 (()=>{}())
                setTimeout(() => {
                    console.log(a);
                }, i * 1000);     // i*1000 表示： 每隔1秒执行一次
            })(i) // i 接受外部参数
        }
        console.log(i); // 6 , 1,2,3,4,5
        
        /*解释: 
            在事件循环里执行顺序是 同步任务 > 微任务 > 宏任务
            console.log(i)是同步任务 所以先执行 setTimeout属于宏任务后执行
            var 定义全局变量 所以先输出 5 
            i*1000 表示： 每隔1秒执行一次 所以每隔1秒内执行一次 输出 1,2,3,4,5
        */

        /**2222222222222222222222222222222222222222222222222222222222222222222222*/
        // var obj1 = { a: 1, b: 2, c: 3, d: { e: 4 } };
        // var obj2 = { ...obj1 }; //...是展开运算符 属于浅拷贝 
        // obj1.a = 2;    // a是基本类型,基本类型不会被拷贝
        // obj1.d.e = 5;
        // // console.log(obj1)  //{a: 2, b: 2, c: 3,  { e: 5}}
        // console.log(obj2)  //{a: 1, b: 2, c: 3,  { e: 5}}
        /*解释: 
            浅拷贝:只拷贝一层
            浅拷贝的方法 :展开运算符  Object.assign(对象) Array.prototype.slice() Array.prototype.concat() 
            在浅拷贝中基本数据类型是不会被拷贝的  
            引用类型存储在堆中 拷贝引用数据类型的地址 在内存中这两个变量指向的是同一个地址，所以改变一个另一个也会改变(同步更新)
            基本数据类型：数字、字符串、布尔值、null、undefined
            引用数据类型：对象{}、数组[]
        */

        // 333333333333333333333333333333333333333333333333333333
        // setTimeout(function () {
        //     console.log(1)  // setTimeout是宏任务
        // }, 0)
        // new Promise(function (resolve) {
        //     console.log(2); // 同步任务
        //     resolve();     // resolve 成功之后的回调走.then 是异步任务的微任务队列
        //     console.log(3); //同步任务
        // }).then(function () {
        //     console.log(4); // .then 调用异步任务的微任务队列
        // })
        // 2 3 4 1
        /*解释: 
            event Loop 的执行顺序是 先走同步任务 > 微任务 > 宏任务
                                        2 3         4       1
            微任务有  [promise,async,await,axios]
            宏任务有  [定时器,事件函数,ajax]
            注意： promise里除了resolve里面的.then .catch都是异步请求
                  await：1.await 前面的都是同步请求      
                         2.await 后面的要是异步请求的函数,如果不是，就还是同步请求
                         3.await 会阻塞后续代码执行
                     
        */

        //444444444444444444444444444444444444444444444444444444444444444444
        const arr = [12, 24, 37, 24, 49, 49, 55, 68];
        /*new set 去重*/
        const brr = [...new Set(arr)];
        
        /*includes 去重*/
        // var brr = [];
        // arr.forEach(item => {
        //     if (!brr.includes(item)) {
        //         brr.push(item)
        //     }
        // })
        
        // filter 去重
        // let brr = arr.filter((item, i) => {
        //     console.log(arr.indexOf(item),i); //判断第一次查找的位置是否跟当前索引相等
        //     return arr.indexOf(item) == i
        // });


        console.log(brr);

    </script>
</body>

</html>